diff --git a/keyserver/src/keyserver.js b/keyserver/src/keyserver.js --- a/keyserver/src/keyserver.js +++ b/keyserver/src/keyserver.js @@ -8,6 +8,9 @@ import os from 'os'; import './cron/cron.js'; + +import stores from 'lib/facts/stores.js'; + import { migrate } from './database/migrations.js'; import { jsonEndpoints } from './endpoints.js'; import { emailSubscriptionResponder } from './responders/comm-landing-responders.js'; @@ -120,6 +123,17 @@ downloadHandler(uploadDownloadResponder), ); + // This endpoint should be handled by the mobile app. If the server + // receives this request, it means that the app is not installed and we + // should redirect the user to a place from which the app can be + // downloaded. + router.get('/invite/:secret', (req, res) => { + res.writeHead(301, { + Location: stores.appStoreUrl, + }); + res.end(); + }); + // $FlowFixMe express-ws has side effects that can't be typed router.ws('/ws', onConnection); router.get('/worker/:worker', webWorkerResponder); diff --git a/landing/qr.react.js b/landing/qr.react.js --- a/landing/qr.react.js +++ b/landing/qr.react.js @@ -9,6 +9,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import * as React from 'react'; +import stores from 'lib/facts/stores.js'; + import css from './qr.css'; function QR(): React.Node { @@ -32,7 +34,7 @@ - +

App Store (pre-alpha)

diff --git a/lib/facts/stores.js b/lib/facts/stores.js new file mode 100644 --- /dev/null +++ b/lib/facts/stores.js @@ -0,0 +1,7 @@ +// @flow + +const stores = { + appStoreUrl: 'https://apps.apple.com/us/app/comm-messenger/id1574433435', +}; + +export default stores;